/*
    2022-09-13  22:28  by  CYL
    目的：用于学习C++的类。
    不含抽象类（ABC），使用抽象类实现C++接口见demo1（含虚函数、纯虚函数）.
*/
#include <iostream>
#include <string>
using namespace std;

class Box{
public:         //【0】public::谁都可以用，一般用作数据封装、或添加纯虚函数后成为接口暴露给外部。
    Box();      //【5】构造函数
    ~Box();     //【6】析构函数
    //类的成员函数声明
    void set(int length,int weight,int height);
    int getVolume();
    //【3】注册一个友元函数，【注意】友元函数不是当前类的成员函数！但其可以访问protected、private。
    friend void showBoxHeight(Box box);
protected:      //【1】protected::仅Box子类（即Box的派生类）、Box类自身及友元可用。
    int length; //箱子的长度
    int weight; //箱子的宽度
private:        //【2】private::仅Box类自身及友元可用。
    int height; //箱子的高度
};              //class可以视为struct的升级版本，所以这个分号不要忘记！
Box::Box()      //【5】
{
    cout<<"This is BoxClass's start func!"<<endl;
}
Box::~Box()     //【6】
{
    cout<<"This is BoxClass's end func!"<<endl;
}
void Box::set(int length,int weight,int height)
{
    this->length = length;
    this->weight = weight;
    this->height = height;
}
int Box::getVolume(){
    int result = this->length * this->weight * this->height;
    cout<<"箱子体积为：";
    cout<<result<<endl;
    return result;
}

/*
    【3】使用友元函数暴露类中的private的东西，注册见上方的【3】，使用方法见下方的【3】
*/
void showBoxHeight(Box box){
    cout<<"Box Class中private中的Height值为："<<box.height<<endl;
}

/*
    【4】类的继承
*/
class Rectangle:public Box  //长方形继承自Box类
{
public:
    Rectangle(){
        cout<<"This is Rectangle's start func!"<<endl;
    }
    ~Rectangle(){
        cout<<"This is Rectangle's end func!"<<endl;
    }
    void set(int length,int weight){
        this->length  = length;
        this->weight = weight;
    }
    int getArea(){
        int result = this->length * this->weight;
        cout<<"长方形的面积为："<<result<<endl;
        return result;
    }
};

int main(){
    Box Box0;
    Box0.set(5,5,5);
    Box0.getVolume();

    Rectangle Rect0;
    Rect0.set(4,4);
    Rect0.getArea();

    showBoxHeight(Box0);    //【3】使用友元函数输出private的数据。
    showBoxHeight(Rect0);   //【3】使用友元函数输出private的数据。当不存在时，貌似是-1。
    //getchar();
    system("pause");
    return 0;
}
